package com.kt.common.clazz.inlineclazz

// 内联函数只能有且只有一个构造函数
// 不能加open字段 ，即不能被继承与继承
 inline class Name(val s: String) : Printable{
    val length: Int
        get() = s.length

    fun greet() {
        println("Hello, $s")
    }

    init {

    }
    companion object{
        val AAA = "111"
    }

    override fun prettyPrint(): String {
        return  AAA
    }
}


interface Printable {
    fun prettyPrint(): String
}


fun main() {
    val f = Foo(42)

    asInline(f)    // 拆箱操作: 用作 Foo 本身
    asGeneric(f)   // 装箱操作: 用作泛型类型 T
    asInterface(f) // 装箱操作: 用作类型 I
    asNullable(f)  // 装箱操作: 用作不同于 Foo 的可空类型 Foo?

    // 在下面这里例子中，'f' 首先会被装箱（当它作为参数传递给 'id' 函数时）然后又被拆箱（当它从'id'函数中被返回时）
    // 最后， 'c' 中就包含了被拆箱后的内部表达(也就是 '42')， 和 'f' 一样
    val c = id(f)
}
interface I

inline class Foo(val i: Int) : I

fun asInline(f: Foo) {
    println(f)
}
fun <T> asGeneric(x: T) {
    println(x)
}
fun asInterface(i: I) {
    println(i)
}
fun asNullable(i: Foo?) {
    println(i)
}

fun <T> id(x: T): T = x
